-- 1. 参数列表
-- 1.1. 优惠券id
local voucherId = ARGV[1]
-- 1.2. 用户id
local userId = ARGV[2]
-- 1.3. 用户id
local orderId = ARGV[3]

-- 2. 数据key
-- 2.1. 库存key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2. 订单key
local orderKey = 'seckill:order:' .. voucherId

-- 3. 脚本业务
-- 3.1. 判断库存是否充足 get stockKey
local stock = redis.call('get', stockKey)
if stock == false then
    -- 3.1.1. 如果库存键不存在，返回错误码 3
    return 3
end

stock = tonumber(stock)
if stock <= 0 then
    -- 3.1.2. 库存不足，返回 1
    return 1
end

-- 3.2. 判断用户是否已下单 SISMEMBER orderKey userId
local isMember = redis.call('sismember', orderKey, userId)
if isMember == 1 then
    -- 3.2.1. 用户已下单，返回 2
    return 2
end

-- 3.3. 扣库存 incrby stockKey -1
local newStock = redis.call('incrby', stockKey, -1)
if newStock < 0 then
    -- 3.3.1. 扣库存失败（可能并发问题导致库存不足），回滚库存并返回 1
    redis.call('incrby', stockKey, 1)
    return 1
end

-- 3.4. 下单（保存用户）sadd orderKey userId
local result = redis.call('sadd', orderKey, userId)
if result == 0 then
    -- 3.4.1. 添加用户到订单集合失败（可能并发问题导致重复下单），回滚库存并返回 2
    redis.call('incrby', stockKey, 1)
    return 2
end

-- 3.5.发送消息到队列中，XADD stream.orders * k1 v1 k2 v2 ...
redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)

-- 3.6. 成功下单，返回 0
return 0